package com.thiswhyme.common.utils.codec;

import com.thiswhyme.common.expection.BusinessException;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @description: MD5工具
 * @date: 2021/9/13
 */
@Slf4j
public class Md5Utils {

    /**
     * 将给定字符串加密为MD5密文
     * @param src 待加密的原始字符串
     * @return
     */
    public static byte[] string2Md5Bytes(String src) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance(EncryptAlgorithm.MD5.name());
            md.update(src.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            log.error("不支持MD5加密算法", e);
            throw new BusinessException("不支持MD5加密算法");
        }
        return md.digest();
    }

    /**
     * 将给定字符串加密为MD5密文并转换为Base64字符串
     * @param src 待加密的原始字符串
     * @return
     */
    public static String string2Md5String(String src) {
        return CodecUtils.bytes2Base64String(string2Md5Bytes(src));
    }

    /**
     * 将给定字符串加密为MD5密文（加盐）
     * @param str 待加密的原始字符串。
     * @param salt 盐值
     * @return
     */
    public static byte[] string2Md5BytesWithSalt(String str, String salt) {
        return string2Md5Bytes(str + salt);
    }

    /**
     * 将给定字符串加密为MD5密文并转换为Base64字符串（加盐）
     * @param str 待加密的原始字符串。
     * @param salt 盐值
     * @return
     */
    public static String string2Md5StringWithSalt(String str, String salt) {
        return string2Md5String(str + salt);
    }
}
